/**
 * 方法装饰器
 */

// ts - 方法装饰器类型说明
// declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;

function log(target: any, key: string, descriptor: any) {
  console.log('key-->', key)
  console.log('descriptor-->', descriptor)
  console.log()

  // 实现一个效果，在执行 runTask之前，打印日志
  const originMethod = descriptor.value

  descriptor.value = function (...args: any[]) {
    console.log('在 runTask 之前执行 - 可以做一些事情，前置动作')

    const result = originMethod.apply(this, args)

    console.log(
      '在 runTask 之后执行, 实际业务场景中可以执行一些  上报日志，清除状态的动作'
    )

    return result
  }
}

class Animal {
  @log
  runTask() {
    console.log('runTask 执行')
  }

  constructor() {
    console.log('构造函数执行')
  }
}

const p1: any = new Animal()

p1.runTask('方法装饰器')
